package od.one;

/**
 * @author: Shelly
 * @create: 2024-01-30 15:02:50
 * @version: 1.0
 * @describe: 分配土地
 * 题目描述
 * 从前有个村庄，村民们喜欢在各种田地上插上小旗子，旗子上标识了各种不同的数字。
 * 某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民，请问此次分配土地，做出贡献的村民种最大会分配多大面积?
 * 输入描述
 * 第一行输入 m 和n，
 * · m代表村子的土地的长
 * · n代表土地的宽
 * 第二行开始输入地图上的具体标识
 * 输出描述
 * 此次分配土地，做出贡献的村民种最大会分配多大面积
 * 备注
 * 旗子上的数字为1~500，土地边长不超过500
 * 未插旗子的土地用0标识
 * 用例1
 * 输入
 * 1  3 3
 * 2  1 0 1
 * 3  0 0 0
 * 4  0 1 0
 * 输出
 * 1  9
 * 说明
 * 土地上的旗子为1，其坐标分别为(0，0)，(2，1)以及(0，2)，为了覆盖所有旗子，矩阵需要覆盖的横坐标为0和2，纵坐标为0和2，所以面积为9, 即(2-0+1)*(2-0+1)=9
 *
 * 用例2
 * 输入
 * 1  3 3
 * 2  1 0 2
 * 3  0 0 0
 * 4  0 3 4
 * 输出
 * 1  1
 * 说明
 * 由于不存在成对的小旗子，故而返回1，即一块土地的面积。
 */
public class OD25 {
}
/*
* 解题思路
1.初始化:
。读取用户输入的土地的长m和宽n。
。创建一个二维数组 land[m][n]来存储土地上每个位置的标识。
。创建两个二维数组minPos[501][2]和maxPos[501][2]来分别存储每个标识数字的最小和最大位置。数组的大小设为501是因为题目中提到数字的范围是1到500。
o 将minPos的每个位置初始化为(m，n) ，maxPos的每个位置初始化为(-1，-1) ，这是因为我们需要在后续的遍历中通过比较来找到实际的最小和最大值。
2.遍历土地：
。通过双层循环遍历土地上的每个位置(i，j)。
。对于每个位置的数字 num , 如果 num不是0, 更新minPos[num]和maxPos[num]。minPos[num] 记录该数字出现的最小行号和列号,maxPos[num] 记录该数字出现的最大行号和列号。
3.计算面积：
。 初始化一个变量maxArea来记录最大面积，初始值设为0。
。遍历每个可能的数字(1到500) ，如果该数字的最小位置小于或等于最大位置(确保该数字在土地上至少出现一次) ，则计算该数字对应的土地面积。
。面积计算公式为(maxPos[i] [0] - minPos[i][0] + 1) * (maxPos[i][1] - minPos[i][1] + 1)。
。更新 maxArea为所有计算出的面积中的最大值。
4.输出结果：
。打印出最大面积maxArea。
*
* 模拟求解过程

假设输入的用例1如下：
1  3 3
2  1 2 1
3  3 1 3
4  1 1 1
这表示土地的长m为3，宽 n为3，土地上的数字分布如输入所示。
按照解题思路进行模拟：
1.初始化:
land数组被填充为：
1  1 2 1
2   3 1 3
3   1 1 1
。minPos和maxPos数组被初始化。
2.遍历土地：
更新 minPos和maxPos数组:
■ minPos[1]更新为(0, 0) , maxPos[1] 更新为(2, 2)。
■ minPos[2]更新为(0, 1) , maxPos[2] 更新为(0, 1)。
■ minPos[3]更新为(1, 0) , maxPos[3] 更新为(1, 2)。
3.计算面积：
计算每个数字的面积：
 对 于数字1: 面积为(2 - 0 + 1) * (2 - 0 + 1) = 9。
 对 于数字2: 面积为(0 - 0 + 1) * (1 - 1 + 1) = 1。
对于数字3: 面积为(1 - 1 + 1) * (2 - 0 + 1) = 3。
。maxArea更新为9。
* */